3 #define MAX(a,b) (((a)>(b))?(a):(b))
4 #define MIN(a,b) (((a)<(b))?(a):(b))
8 //Describe el segmento de recta que es >= a min y <= a max
11 //recta(int mn, int mx){min = mn; max = mx;}
14 recta
make_recta(int mn
, int mx
){ recta r
; r
.min
= mn
; r
.max
= mx
; return r
; }
16 //Describe un cubo en términos de sus regiones en cada plano
19 cubo(recta X
, recta Y
, recta Z
){x
= X
; y
= Y
; z
= Z
;}
23 //Retorna verdadero si puede calcular la interseccion de dos rectas
24 //Almacena el resultado en c
25 bool interseccion(recta a
, recta b
, recta
&c
){
26 if (a
.min
> b
.max
|| b
.min
> a
.max
) return false;
27 c
.min
= MAX(a
.min
,b
.min
);
28 c
.max
= MIN(a
.max
,b
.max
);
32 bool interseccion(cubo a
, cubo b
, cubo
&c
){
33 if (!interseccion(a
.x
, b
.x
, c
.x
)) return false;
34 if (!interseccion(a
.y
, b
.y
, c
.y
)) return false;
35 if (!interseccion(a
.z
, b
.z
, c
.z
)) return false;
46 cin
>> x
>> y
>> z
>> r
;
47 cubo
resultado(make_recta(x
, x
+r
), make_recta(y
, y
+r
), make_recta(z
, z
+r
));
49 for (int i
=1; i
<noCubos
; ++i
){
50 cin
>> x
>> y
>> z
>> r
;
51 cubo
temp(make_recta(x
, x
+r
), make_recta(y
, y
+r
), make_recta(z
, z
+r
));
52 if (!interseccion(resultado
, temp
, resultado
)){
59 cout
<< (resultado
.x
.max
- resultado
.x
.min
)*(resultado
.y
.max
- resultado
.y
.min
)*(resultado
.z
.max
- resultado
.z
.min
) << endl
;